package com.itheima.pinda.file.manager;

import com.itheima.pinda.file.dto.chunk.FileUploadDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.io.File;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: 吴向明
 * @Date: 2021/09/17/12:36
 * @Description:封装分片操作的工具类,主要用于创建临时分片,分片存放的目录
 */
@Component
@Slf4j
public class WebUploader {
    /**
     * @param fileUploadDTO
     * @param path
     * @return
     */
    public java.io.File getReadySpace(FileUploadDTO fileUploadDTO, String path) {
        boolean b = createFileFolder(path, false);
        if (!b) {
            return null;
        }

        //将分片文件保存到文件名对应的md5构成的目录中
        String fileFolder = fileUploadDTO.getName();
        if (fileFolder == null) {
            return null;
        }

        path += "/" + fileFolder;

        //创建临时文件和存放分片的目录
        b = createFileFolder(path, true);
        if (!b) {
            return null;
        }


        //构造需要上传的分片文件对应的路径 D:\\uploadFiles\\2020\\05\\www\\3
        return new java.io.File(path, String.valueOf(fileUploadDTO.getChunk()));
    }

    /**
     * 具体执行创建分片所在的目录和临时文件
     *
     * @param file
     * @param hasTmp 是否需要创建临时文件
     * @return
     */
    private boolean createFileFolder(String file, boolean hasTmp) {// D:\\uploadFiles
        java.io.File tmpFile = new java.io.File(file);
        if (!tmpFile.exists()) {
            try {
                tmpFile.mkdirs();//创建目录
            } catch (Exception e) {
                log.error("创建分片所在目录失败", e);
                return false;
            }
        }
        if (hasTmp) {
            //需要创建临时文件
            tmpFile = new File(file + ".tmp");
            if (tmpFile.exists()) {
                //临时文件已经存在,修改临时文件的最后更新时间为系统当前时间
                return tmpFile.setLastModified(System.currentTimeMillis());
            } else {
                //临时文件不存在,需要创建
                try {
                    tmpFile.createNewFile(); //创建文件
                } catch (Exception e) {
                    log.error("创建分片对应的临时文件失败", e);
                    return false;
                }
            }
        }
        return true;

    }
}
